{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "80983e7a",
   "metadata": {},
   "source": [
    "# 使用窗函数设计FIR带通滤波器"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "04e3da3e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#导入使用的库\n",
    "import numpy as np;from math import *\n",
    "from scipy import signal,fft\n",
    "import matplotlib.pyplot as plt\n",
    "from matplotlib.ticker import MaxNLocator\n",
    "\n",
    "#滤波器参数\n",
    "fs = 20000; #抽样频率\n",
    "wp1 = 2*pi*3000/fs;wp2 = 2*pi*5000/fs #通带截止频率\n",
    "ws1 = 2*pi*2000/fs;ws2 = 2*pi*6000/fs #阻带截止频率\n",
    "w1 = (wp1+ws1)/2;w2 = (wp2+ws2)/2 \n",
    "Bt = np.array([np.abs(wp1-ws1),np.abs(wp2-ws2)]);Bt = Bt.min() #过渡带宽\n",
    "\n",
    "#由阻带衰减As = 55，可以确定窗形状为布拉克曼窗\n",
    "N = np.ceil((11*pi)/Bt)+1;N = int(N+(N+1)%2)#滤波器长度点数（取奇数）\n",
    "wn = signal.windows.blackman(N) #布拉克曼窗的wn值\n",
    "\n",
    "#理想低通滤波器的单位取样响应\n",
    "t = int((N-1)/2)\n",
    "n1 = np.arange(N);n1 = np.delete(n1,t)\n",
    "hd = (np.sin(w2*(n1-t))-np.sin(w1*(n1-t)))/(pi*(n1-t))\n",
    "hd = np.insert(hd,t,(w2-w1)/pi)\n",
    "\n",
    "#线性相位FIR滤波器\n",
    "h = hd*wn;N0 = N*1000\n",
    "He = np.abs(fft.fft(h,N0));He = He/np.max(He)\n",
    "Ar = 20*np.log10(He);N1 = int(N0/2);f = np.linspace(0,1,N1)\n",
    "\n",
    "#绘制滤波器的幅度响应\n",
    "fig,ax = plt.subplots();ax.plot(f,Ar[:N1]);ax.grid()\n",
    "ax.set_title('使用布拉克曼窗设计的FIR滤波器的幅度响应');ax.set_xlabel('k')\n",
    "ax.set_xlabel(r'$ \\omega / \\pi $')\n",
    "ax.set_ylabel(r'$ 20log_{10}| H (e^{j \\omega}) | $')\n",
    "ax.set_xlim([0,1]);ax.set_ylim([-100,1])\n",
    "ax.xaxis.set_major_locator(MaxNLocator(11))\n",
    "ax.yaxis.set_major_locator(MaxNLocator(11))\n",
    "plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签\n",
    "plt.rcParams['axes.unicode_minus'] = False #用来显示负号\n",
    "fig.savefig('./fir_window2.png',dpi=500)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "1b8f2536",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
